package com.pacifico.telebusca.web.controladores;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.displaytag.tags.TableTagParameters;
import org.displaytag.util.ParamEncoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.pacifico.telebusca.dominio.Empresa;
import com.pacifico.telebusca.exception.Errores;
import com.pacifico.telebusca.web.facade.TeleBuscaFacade;
import com.pacifico.telebusca.web.util.Util;

@Controller
public class ControladorEmpresa {

	private static final String PAGE_PARAM = new ParamEncoder("result").encodeParameterName(TableTagParameters.PARAMETER_PAGE);
	
	@Autowired
	private TeleBuscaFacade teleBuscaFacade;
	
	@Value("#{telebusca['maximofilas']}")
	private String maxNumber;

	@RequestMapping(value = "/crearempresa", method = RequestMethod.GET)
	public String crearFormulario(ModelMap model,
			@ModelAttribute Empresa empresa) {
		try {
			int total = teleBuscaFacade.buscarContarEmpresas();
			List<Empresa> empresas = teleBuscaFacade.buscarEmpresas(0, total);
			model.addAttribute("mostrarCrear", "mostrarCrear");
			model.addAttribute("empresa", empresa);
			model.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			if (empresas != null && empresas.size() > 0) {
				model.addAttribute("empresas",empresas);
			}
			model.addAttribute("mensaje", Errores.MAP.get("E3001"));
		} catch (Exception e) {
			e.printStackTrace();
			
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection") ||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							model.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientoempresa";
						}
					}
				}	
			}
			
			
			model.addAttribute("error", e.getMessage());
			teleBuscaFacade.registrarAuditoria("T0004", "T0006");
			return "mantenimientoempresa";
		}
		

		return "mantenimientoempresa";

	}

	@RequestMapping(value = "/guardarempresa", method = RequestMethod.POST)
	public String guardarEmpresa(ModelMap map, @ModelAttribute Empresa empresa) {
		List<Empresa> empresas;
		try {
			empresa.setSts("A");
			empresa.setUsuarioCreacion(Util.obtenerNombreUsuario(SecurityContextHolder.getContext()));
			empresa.setUsuarioModificacion(Util.obtenerNombreUsuario(SecurityContextHolder.getContext()));
			empresa.setFechaCreacion(Util.getDate());
			empresa.setFechaModificacion(Util.getDate());
			empresas = teleBuscaFacade.buscarEmpresaPorNombre(empresa.getNombreEmpresa().toLowerCase());
			if (empresas != null && !empresas.isEmpty()){
				map.addAttribute("mensajeempresa", "La empresa a crear ya existe. ");
				int total = teleBuscaFacade.buscarContarEmpresas();
				empresas = teleBuscaFacade.buscarEmpresas(0, total);
				map.addAttribute("empresas", empresas);
				map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
				if (empresas == null || empresas.isEmpty()){
					map.addAttribute("mensajeempresa", Errores.MAP.get("E3001"));	
				}
				teleBuscaFacade.registrarAuditoria("T0004", "T0006");
				return "mantenimientoempresa";
			}
			
			teleBuscaFacade.guardarEmpresa(empresa);			
			int total = teleBuscaFacade.buscarContarEmpresas();
			empresas = teleBuscaFacade.buscarEmpresas(0, total);
			map.addAttribute("empresas",empresas);
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			teleBuscaFacade.registrarAuditoria("T0004", "T0005");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientoempresa";
						}
					}
				}	
			}
			map.addAttribute("error", e.getMessage());
			teleBuscaFacade.registrarAuditoria("T0004", "T0006");
			return "mantenimientoempresa";
		}
		return "mantenimientoempresa";

	}

	@RequestMapping(value = "/buscarempresas", method = RequestMethod.GET)
	public String buscar(HttpServletRequest request,
			HttpServletResponse response, Model map) {

		List<Empresa> empresas = null;
		try {
			Integer firstResult = null;
			Integer numberoPagina = null;
			String numberoPaginas = request.getParameter(PAGE_PARAM);
			
			
			int total = teleBuscaFacade.buscarContarEmpresas();
			if (numberoPaginas != null){
				numberoPagina = Integer.valueOf(numberoPaginas);
				firstResult = (numberoPagina - 1) * Integer.valueOf(maxNumber);	
			}
			
			if (firstResult == null){				
				empresas = teleBuscaFacade.buscarEmpresas(0, total);				
			} else {
				empresas = teleBuscaFacade.buscarEmpresas(firstResult, Integer.valueOf(maxNumber));
			}
			
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			map.addAttribute("empresas", empresas);
			
			
			if (empresas == null || empresas.isEmpty()){
				map.addAttribute("mensajeempresa", Errores.MAP.get("E3001"));	
			}
			
			map.addAttribute("mostrarCrear", null);
			map.addAttribute("mostrarActualizar", null);
			teleBuscaFacade.registrarAuditoria("T0001", "T0003");
		} catch (Exception e) {
			e.printStackTrace();
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientoempresa";
						}
					}
				}	
			}
			try {
				teleBuscaFacade.registrarAuditoria("T0001", "T0002");
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			return "mantenimientoempresa";
			
		}
		return "mantenimientoempresa";
	
	}
	
	@RequestMapping(value = "/eliminarActualizarEmpresa", method = RequestMethod.GET)
	public String eliminarEmpresa(ModelMap map,
			@ModelAttribute Empresa empresa, @RequestParam int codEmpresa) {

		try {
			teleBuscaFacade.eliminarUsuarioEmpresaByCodEmpresa(codEmpresa);
			teleBuscaFacade.eliminarEmpresa(codEmpresa);
			int total = teleBuscaFacade.buscarContarEmpresas();
			List<Empresa> empresas = teleBuscaFacade.buscarEmpresas(0, total);
			map.addAttribute("empresas", empresas);
			if (empresas == null || empresas.isEmpty()){
				map.addAttribute("mensajeempresa", Errores.MAP.get("E3001"));	
			}
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			teleBuscaFacade.registrarAuditoria("T0007", "T0007");

		} catch (Exception e) {
			e.printStackTrace();
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientoempresa";
						}
					}
				}	
			}
			map.addAttribute("error", e.getMessage());
			teleBuscaFacade.registrarAuditoria("T0007", "T0009");
			return "mantenimientoempresa";
		}

		return "mantenimientoempresa";

	}

	@RequestMapping(value = "/mostrarActualizarEmpresa", method = RequestMethod.GET)
	public String mostrarActualizar(ModelMap map, @RequestParam int codEmpresa) {
		try {
			Empresa empresa = teleBuscaFacade
					.buscarEmpresaPorCodigo(codEmpresa);
			map.addAttribute("empresa", empresa);
			int total = teleBuscaFacade.buscarContarEmpresas();
			List<Empresa> empresas = teleBuscaFacade.buscarEmpresas(0, total);
			map.addAttribute("empresas", empresas);
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			map.addAttribute("mostrarActualizar", "mostrarActualizar");			
			teleBuscaFacade.registrarAuditoria("T0010", "T0011");
		} catch (Exception e) {
			e.printStackTrace();
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientoempresa";
						}
					}
				}	
			}
			map.addAttribute("error", e.getMessage());
			teleBuscaFacade.registrarAuditoria("T0010", "T0012");
			return "mantenimientoempresa";
		}
		return "mantenimientoempresa";

	}

	@RequestMapping(value = "/actualizarempresa", method = RequestMethod.POST)
	public String actualizar(ModelMap map, @ModelAttribute Empresa empresa) {
		try {
			List<Empresa> empresas = null;
			
			
			Empresa empresaA = teleBuscaFacade.buscarEmpresaPorCodigo(empresa
					.getCodEmpresa());
			empresaA.setCarpeta(empresa.getCarpeta());			
			empresaA.setNombreEmpresa(empresa.getNombreEmpresa());			
			empresaA.setUsuarioModificacion(Util.obtenerNombreUsuario(SecurityContextHolder.getContext()));			
			empresaA.setFechaModificacion(Util.getDate());	
			map.addAttribute("maxNumber", Integer.valueOf(maxNumber));
			teleBuscaFacade.actualizarEmpresa(empresaA);
			
			int total = teleBuscaFacade.buscarContarEmpresas();
			empresas = teleBuscaFacade.buscarEmpresas(0, total);	
			
			map.addAttribute("empresas", empresas);
			
			if (empresas == null || empresas.isEmpty()){
				map.addAttribute("mensajeempresa", Errores.MAP.get("E3001"));	
			}
			teleBuscaFacade.registrarAuditoria("T0010", "T0011");
		} catch (Exception e) {
			e.printStackTrace();
			if (e.getCause()!=null){
				if (e.getCause().getCause()!=null){
					if(!e.getCause().getCause().getMessage().equals("")){
						if(e.getCause().getCause().getMessage().contains("Cannot release connection")||
								e.getCause().getCause().getMessage().contains("Cannot open connection")||
								e.getCause().getCause().getMessage().contains("JDBC rollback failed")){
							map.addAttribute("error", Errores.MAP.get("E0002"));				
							return "mantenimientoempresa";
						}
					}
				}	
			}
			map.addAttribute("error", e.getMessage());
			teleBuscaFacade.registrarAuditoria("T0010", "T0012");
			return "mantenimientoempresa";
		}
		return "mantenimientoempresa";

	}

}
